﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;
using System.Data.OleDb;
using DAO;
using DTO;
using BUS;
namespace QL_xxx
{
	/// <summary>
	/// Interaction logic for QLBaoCao_View.xaml
	/// </summary>
	public partial class QLBaoCao_View : UserControl
	{
        private List<PhieuThuePhongDTO> DSPhieuThue = null;
        private List<PhongDTO> DSPhong = null;
        private List<LoaiPhongDTO> DSLoaiPhong = null;
        private List<BaoCaoPhongDTO> DSBCPhong = null;
        private List<BaoCaoLoaiPhongDTO> DSBCLoaiPhong = null;
        private int thang = -1;
        private int nam = DateTime.Now.Year;
        private DataTable BangBaoCao = null;
		public QLBaoCao_View()
		{
			this.InitializeComponent();
		}

        private void btnLoaiPhong_Click(object sender, RoutedEventArgs e)
        {
            BangBaoCao = new DataTable();
            TyLeDoanhThu();
            if (DSBCLoaiPhong != null && DSBCLoaiPhong.Count > 0)
            {
                GridBaoCao.ItemsSource = DSBCLoaiPhong;
                GridBaoCao.Columns[1].Header = "Tên Loại Phòng";
                GridBaoCao.Columns[2].Header = "Doanh Thu";
                GridBaoCao.Columns[3].Header = "Tỷ Lệ";

                GridBaoCao.Columns[1].Width = GridBaoCao.ActualWidth / 3;
                GridBaoCao.Columns[2].Width = GridBaoCao.ActualWidth / 3;
                GridBaoCao.Columns[3].Width = GridBaoCao.ActualWidth / 3;
                GridBaoCao.Columns[0].Visibility = Visibility.Hidden;
                btnXuatBC.Visibility = Visibility.Visible;

                //tao Bang Bao cao 
                BangBaoCao.Columns.Add("Tên Loại Phòng");
                BangBaoCao.Columns.Add("Doanh Thu");
                BangBaoCao.Columns.Add("Tỷ Lệ");
                foreach (BaoCaoLoaiPhongDTO bcLoaiPhong in DSBCLoaiPhong)
                {
                    DataRow Dong = BangBaoCao.NewRow();
                    BangBaoCao.Rows.Add(Dong);
                    Dong["Tên Loại Phòng"] = bcLoaiPhong.TenLoaiPhong;
                    Dong["Doanh Thu"] = bcLoaiPhong.DoanhThu;
                    Dong["Tỷ Lệ"] = bcLoaiPhong.TyLe;
                }

            }
            else
                MessageBox.Show("Chưa có dữ liệu để lập báo cáo", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
            
        }
      

        private void btnMatDoSuDung_Click(object sender, RoutedEventArgs e)
        {
            BangBaoCao = new DataTable();
            TyLeMatDoSuDung();
            if (DSBCPhong != null && DSBCPhong.Count > 0)
            {
                GridBaoCao.ItemsSource = DSBCPhong;
                GridBaoCao.Columns[1].Header = "Tên Phòng";
                GridBaoCao.Columns[2].Header = "Số Ngày Thuê";
                GridBaoCao.Columns[3].Header = "Tỷ Lệ";

                GridBaoCao.Columns[0].Width = GridBaoCao.ActualWidth / 3;
                GridBaoCao.Columns[1].Width = GridBaoCao.ActualWidth / 3;
                GridBaoCao.Columns[2].Width = GridBaoCao.ActualWidth / 3;
                GridBaoCao.Columns[0].Visibility = Visibility.Hidden;
                btnXuatBC.Visibility = Visibility.Visible;
                //tao Bang Bao cao 
                BangBaoCao.Columns.Add("Tên Phòng");
                BangBaoCao.Columns.Add("Số Ngày Thuê");
                BangBaoCao.Columns.Add("Tỷ Lệ");
                foreach (BaoCaoPhongDTO bcPhong in DSBCPhong)
                {
                    DataRow Dong = BangBaoCao.NewRow();
                    BangBaoCao.Rows.Add(Dong);
                    Dong[GridBaoCao.Columns[1].Header.ToString()] = bcPhong.TenPhong;
                    Dong[GridBaoCao.Columns[2].Header.ToString()] = bcPhong.SoNgayThue;
                    Dong[GridBaoCao.Columns[3].Header.ToString()] = bcPhong.TyLeMatDo;
                }
            }
            else
                MessageBox.Show("Chưa có dữ liệu để lập báo cáo", "Lỗi", MessageBoxButton.OK, MessageBoxImage.Error);
            
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {

            cbxThang.Items.Clear();
            cbxnam.Items.Clear();
            int thang = DateTime.Now.Month;
            for (int i = 1; i <= thang; i++)
            {
                cbxThang.Items.Add(i);
                
            }
            for (int i = DateTime.Now.Year; i >= DateTime.Now.Year - 5; i--)
            {
                cbxnam.Items.Add(i);
            }
            cbxnam.SelectedIndex = 0;
            btnLoaiPhong.IsEnabled = false;
            btnMatDoSuDung.IsEnabled = false;
            btnXuatBC.Visibility = Visibility.Hidden;
        }

        private void cbxThang_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            int i = -1;
              i   = cbxThang.SelectedIndex;
              if (i != -1)
              {
                  thang = (int)cbxThang.Items[i];

                  btnLoaiPhong.IsEnabled = true;
                  btnMatDoSuDung.IsEnabled = true;
              }
        }

        //tinh  so ngay su dung trong thang
        public void XuLyBaoCaoMatDo()
        {
            DSBCPhong = new List<BaoCaoPhongDTO>();
            //cap Nhat danh sach phong vao BaoCaoPhongDTO;
            DSPhong = PhongBUS.LayDSPhong(-1, null, -1, -1);
            foreach (PhongDTO Phong in DSPhong)
            {
                BaoCaoPhongDTO baocao = new BaoCaoPhongDTO();
                baocao.MaPhong = Phong.MaPhong;
                baocao.TenPhong = Phong.TenPhong;
                baocao.SoNgayThue = 0;
                baocao.TyLeMatDo = "";
                DSBCPhong.Add(baocao);
            }
            //////////////////////////////////////////////////////
            DSPhieuThue = PhieuThuePhongBUS.LayDSPhieuThuePhong(-1, -1, thang,nam);
            if (DSPhieuThue != null && DSPhieuThue.Count > 0)
            {
                foreach (BaoCaoPhongDTO baocao in DSBCPhong)
                {
                    foreach (PhieuThuePhongDTO phieuThue in DSPhieuThue)
                    {
                        if (baocao.MaPhong == phieuThue.MaPhong)
                        {
                            baocao.SoNgayThue = baocao.SoNgayThue + KhachSan.TinhSoNgayThuePhong(phieuThue);
                        }
                    }
                }
            }
        }


        //tinh ty le theo mat do su dung
        public void TyLeMatDoSuDung()
        {
            int tongSoNgayThue = 0;
            XuLyBaoCaoMatDo();
            foreach (BaoCaoPhongDTO baocao in DSBCPhong)
            {
                tongSoNgayThue += baocao.SoNgayThue;
            }
            foreach (BaoCaoPhongDTO baocao in DSBCPhong)
            {
                if (baocao.SoNgayThue == 0)
                    baocao.TyLeMatDo = "0%";
                else
                {
                    float matdo = (float)baocao.SoNgayThue / tongSoNgayThue*100;
                    baocao.TyLeMatDo = matdo.ToString() + "%";
                }
            }
        }
        //tinh doanh thu loai phong
        public void XuLyBaoCaoDoanhThu()
        {
            DSBCLoaiPhong = new List<BaoCaoLoaiPhongDTO>();
            //lay danh sach cac loai phong
            DSLoaiPhong = LoaiPhongBUS.LayDSLoaiPhong(-1, null);
            foreach (LoaiPhongDTO LoaiPhong in DSLoaiPhong)
            {
                BaoCaoLoaiPhongDTO bcLoaiPhong = new BaoCaoLoaiPhongDTO();
                bcLoaiPhong.MaLoaiPhong = LoaiPhong.MaLoaiPhong;
                bcLoaiPhong.TenLoaiPhong = LoaiPhong.TenLoaiPhong;
                bcLoaiPhong.DoanhThu = 0;
                bcLoaiPhong.TyLe = "";
                DSBCLoaiPhong.Add(bcLoaiPhong);
            }
            //tinh doanh thu cho tung loai phong
            DSPhieuThue = PhieuThuePhongBUS.LayDSPhieuThuePhong(-1, -1, thang,nam);
            if (DSPhieuThue != null && DSPhieuThue.Count > 0)
            {
                foreach (BaoCaoLoaiPhongDTO bcLoaiPhong in DSBCLoaiPhong)
                {
                    foreach (PhieuThuePhongDTO PhieuThue in DSPhieuThue)
                    {
                        DSPhong = PhongBUS.LayDSPhong(PhieuThue.MaPhong, null, -1, -1);
                        if (bcLoaiPhong.MaLoaiPhong == DSPhong[0].MaLoaiPhong)
                            bcLoaiPhong.DoanhThu = bcLoaiPhong.DoanhThu + KhachSan.tinhTienThuePhong(PhieuThue);
                    }
                }
            }
        }
        //tinh ty le theo doanh thu
        public void TyLeDoanhThu()
        {
            int tongDoanhThu = 0;
            XuLyBaoCaoDoanhThu();
            foreach (BaoCaoLoaiPhongDTO bcLoaiPhong in DSBCLoaiPhong)
            {
                tongDoanhThu = tongDoanhThu + bcLoaiPhong.DoanhThu;
            }
            foreach (BaoCaoLoaiPhongDTO bcLoaiPhong in DSBCLoaiPhong)
            {
                if (bcLoaiPhong.DoanhThu == 0)
                    bcLoaiPhong.TyLe = "0%";
                else
                {
                    float tyle = (float)bcLoaiPhong.DoanhThu / tongDoanhThu*100;
                    bcLoaiPhong.TyLe = tyle.ToString() + "%";
                }
            }
        }

        private void btnXuatBC_Click(object sender, RoutedEventArgs e)
        {

            Export(BangBaoCao, "BAOCAO", "BÁO CÁO THÁNG " + thang);

        }
        
        //xuat ra file excel
        public void Export(DataTable dt, string sheetName, string title)
        {
            //Tạo các đối tượng Excel
            Microsoft.Office.Interop.Excel.Application oExcel = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbooks oBooks;
            Microsoft.Office.Interop.Excel.Sheets oSheets;
            Microsoft.Office.Interop.Excel.Workbook oBook;
            Microsoft.Office.Interop.Excel.Worksheet oSheet;

            //Tạo mới một Excel WorkBook 
            oExcel.Visible = true;
            oExcel.DisplayAlerts = false;
            oExcel.Application.SheetsInNewWorkbook = 1;
            oBooks = oExcel.Workbooks;

            oBook = (Microsoft.Office.Interop.Excel.Workbook)(oExcel.Workbooks.Add(Type.Missing));
            oSheets = oBook.Worksheets;
            oSheet = (Microsoft.Office.Interop.Excel.Worksheet)oSheets.get_Item(1);
            oSheet.Name = sheetName;

            // Tạo phần đầu nếu muốn
            Microsoft.Office.Interop.Excel.Range head = oSheet.get_Range("A1", "C1");
            head.MergeCells = true;
            head.Value2 = title;
            head.Font.Bold = true;
            head.Font.Name = "Tahoma";
            head.Font.Size = "18";
            head.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;

            //6Tạo tiêu đề cột 
            Microsoft.Office.Interop.Excel.Range cl1 = oSheet.get_Range("A3", "A3");
            cl1.Value2 = GridBaoCao.Columns[1].Header.ToString();
            cl1.ColumnWidth = 20;

            Microsoft.Office.Interop.Excel.Range cl2 = oSheet.get_Range("B3", "B3");
            cl2.Value2 = GridBaoCao.Columns[2].Header.ToString();
            cl2.ColumnWidth = 20;

            Microsoft.Office.Interop.Excel.Range cl3 = oSheet.get_Range("C3", "C3");
            cl3.Value2 = "Tỷ Lệ";
            cl3.ColumnWidth = 20;

            Microsoft.Office.Interop.Excel.Range rowHead = oSheet.get_Range("A3", "C3");
            rowHead.Font.Bold = true;
            // Kẻ viền
            rowHead.Borders.LineStyle = Microsoft.Office.Interop.Excel.Constants.xlSolid;
            // Thiết lập màu nền
            rowHead.Interior.ColorIndex = 15;
            rowHead.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;


            // Tạo mẳng đối tượng để lưu dữ toàn bồ dữ liệu trong DataTable,
            // vì dữ liệu được được gán vào các Cell trong Excel phải thông qua object thuần.
            object[,] arr = new object[dt.Rows.Count, dt.Columns.Count];

            //Chuyển dữ liệu từ DataTable vào mảng đối tượng
            for (int r = 0; r < dt.Rows.Count; r++)
            {
                DataRow dr = dt.Rows[r];
                for (int c = 0; c < dt.Columns.Count; c++)
                {
                    arr[r, c] = dr[c];
                }
            }

            //Thiết lập vùng điền dữ liệu
            int rowStart = 4;
            int columnStart = 1;

            int rowEnd = rowStart + dt.Rows.Count - 1;
            int columnEnd = dt.Columns.Count;

            // Ô bắt đầu điền dữ liệu
            Microsoft.Office.Interop.Excel.Range c1 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[rowStart, columnStart];
            // Ô kết thúc điền dữ liệu
            Microsoft.Office.Interop.Excel.Range c2 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[rowEnd, columnEnd];
            // Lấy về vùng điền dữ liệu
            Microsoft.Office.Interop.Excel.Range range = oSheet.get_Range(c1, c2);

            //Điền dữ liệu vào vùng đã thiết lập
            range.Value2 = arr;

            // Kẻ viền
            range.Borders.LineStyle = Microsoft.Office.Interop.Excel.Constants.xlSolid;
            // Căn giữa cột STT
            Microsoft.Office.Interop.Excel.Range c3 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[rowEnd, columnStart];
            Microsoft.Office.Interop.Excel.Range c4 = oSheet.get_Range(c1, c3);
            oSheet.get_Range(c3, c4).HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;

        }

        private void cbxnam_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            int i = -1; 
               i = cbxnam.SelectedIndex;
               if (i != -1)
               {
                   nam = (int)cbxnam.Items[i];
               }
   
           
        }
    }
}